package pfc.etsii.ull.es.shared.utilidades;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Set;

import org.moxieapps.gwt.highcharts.client.Legend;
import org.moxieapps.gwt.highcharts.client.Series;
import org.moxieapps.gwt.highcharts.client.plotOptions.AreaPlotOptions;
import org.moxieapps.gwt.highcharts.client.plotOptions.BarPlotOptions;
import org.moxieapps.gwt.highcharts.client.plotOptions.ColumnPlotOptions;
import org.moxieapps.gwt.highcharts.client.plotOptions.LinePlotOptions;
import org.moxieapps.gwt.highcharts.client.plotOptions.PiePlotOptions;
import org.moxieapps.gwt.highcharts.client.plotOptions.PlotOptions;
import org.moxieapps.gwt.highcharts.client.plotOptions.ScatterPlotOptions;
import org.moxieapps.gwt.highcharts.client.plotOptions.SplinePlotOptions;

public class Utiles {
	
	private static boolean isNumericPostion(String cadena){
		try {
			Integer.parseInt(cadena);
			return true;
		} catch (NumberFormatException nfe){
			return false;
		}
	}

	
	
	public static boolean isNumericList(List<String> cadena) {
		
		boolean isNumeric = true;
		
		for (String elem : cadena) {
			if (!isNumericPostion(elem)) 
				isNumeric = false;
		}
		
		return isNumeric;
	}
	
	public static Number maximoValor(Number maxActual, List<String> lista) {
		
		try {
			String numero = Collections.max(lista);
			if (maxActual.doubleValue() > Double.parseDouble(numero)) {
				maxActual = Double.parseDouble(numero);
			}
		} catch (NoSuchElementException e) {
			return maxActual;
		}
		return maxActual;
	}
	
	
	public static Number maximoValor(List<String> lista) {
		
		Number maxActual = null;
		
		try {
			String numero = Collections.max(lista);
			maxActual = Double.parseDouble(numero);
		} catch (NoSuchElementException e) {
			return 100.0;
		}
		return maxActual;
	}
	
	public static Number minimoValor(List<String> lista) {
		
		Number maxActual = null;
		
		try {
			String numero = Collections.min(lista);
			maxActual = Double.parseDouble(numero);
		} catch (NoSuchElementException e) {
			return 0.0;
		}
		return maxActual;
	}
	
	
	public static Number maxEjeY(String ma, List<String> lista) { 
				
		if (ma == null || ma.isEmpty()) {
			return maximoValor(lista);
		} else {
			return Double.parseDouble(ma);
		}
		
	}
	
	
	public static Number minEjeY(String ma, List<String> lista) { 
		
		if (ma == null || ma.isEmpty()) {
			return minimoValor(lista);
		} else {
			return Double.parseDouble(ma);
		}
		
	}
	
	
	public static List<String> uneListas(List<String> listOne, List<String> listTwo) {
		
		Set<String> set = new HashSet<String>();
		
		if (listOne != null) set.addAll(listOne);
		if (listTwo != null) set.addAll(listTwo);

		return new ArrayList<String>(set);
	}
	
	public static Series.Type tipoSerie(String tipo) {
		
		tipo = tipo.toUpperCase();
		
		if ("LINEAS".equals(tipo)) {
			return Series.Type.LINE;
		}
		if ("BARRAS".equals(tipo)) {
			return Series.Type.BAR;
		}
		if ("SCATTER".equals(tipo)) {
			return Series.Type.SCATTER;
		}		
		if ("COLUMNAS".equals(tipo)) {
			return Series.Type.COLUMN;
		}		
		if ("AREA".equals(tipo)) {
			return Series.Type.AREA;
		}		
		if ("SPLINE".equals(tipo)) {
			return Series.Type.SPLINE;
		}		
		if ("TARTA".equals(tipo)) {
			return Series.Type.PIE;
		}
		
		
		
		return Series.Type.LINE;
		
	}
	
	public static PlotOptions<?> crearOpciones(String tipo) {
		
		tipo = tipo.toUpperCase();
		
		if ("LINEAS".equals(tipo)) {
			LinePlotOptions opciones = new LinePlotOptions();
			return opciones;
		}
		if ("BARRAS".equals(tipo)) {
			BarPlotOptions opciones = new BarPlotOptions();
			return opciones;
		}
		if ("SCATTER".equals(tipo)) {
			ScatterPlotOptions opciones = new ScatterPlotOptions();
			return opciones;
		}		
		if ("COLUMNAS".equals(tipo)) {
			ColumnPlotOptions opciones = new ColumnPlotOptions();
			return opciones;
		}		
		if ("AREA".equals(tipo)) {
			AreaPlotOptions opciones = new AreaPlotOptions();
			return opciones;
		}		
		if ("SPLINE".equals(tipo)) {
			SplinePlotOptions opciones = new SplinePlotOptions();
			return opciones;
		}		
		if ("TARTA".equals(tipo)) {
			PiePlotOptions opciones = new PiePlotOptions();
			return opciones;
		}
		
		
		
		LinePlotOptions opciones = new LinePlotOptions();
		return opciones;
		
	}
	
	public static Legend.Align alineacionHorizLeyenda(String horizontal) {
		
		horizontal = horizontal.toUpperCase();
		
		if ("IZQUIERDA".equals(horizontal)) {
			return Legend.Align.LEFT;
		}
		if ("DERECHA".equals(horizontal)) {
			return Legend.Align.RIGHT;
		}
		if ("CENTRADO".equals(horizontal)) {
			return Legend.Align.CENTER;
		}
		
		
		return Legend.Align.LEFT;
	}
	
	public static Legend.VerticalAlign alineacionVertiLeyenda(String vertical) {
		
		vertical = vertical.toUpperCase();
		
		if ("ARRIBA".equals(vertical)) {
			return Legend.VerticalAlign.TOP;
		}
		
		if ("CENTRADO".equals(vertical)) {
			return Legend.VerticalAlign.MIDDLE;
		}
		
		if ("ABAJO".equals(vertical)) {
			return Legend.VerticalAlign.BOTTOM;
		}
		
		return Legend.VerticalAlign.TOP;
	}
}
